﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

//枚举类型
//枚举顾名思义就是一一列举，把所有可能取值一一列举出来（枚举）
//例如：一周的7天可以一一列举、性别、月份等
//枚举类型的关键字是 enum

//enum Sex
//{
//	MALE,
//	FEMALE,
//	SECRET
//};

//赋初始值
//enum Sex
//{
//	MALE=1,
//	FEMALE=4,
//	SECRET=8
//};
//
//int main()
//{
//	enum Sex s = FEMALE;//用枚举类型创建一个变量，给它赋值一个可能取值
//
//	printf("%d\n", MALE);//0
//	printf("%d\n", FEMALE);//1
//	printf("%d\n", SECRET);//2
//
//	return 0;
//}
//以上定义的enum Sex 就是枚举类型，{ }内就是枚举类型的可能取值，也叫枚举常量；这些可能取值都是有值的，默认从0开始，一次递增1，
//当然在定义时也可以赋初始值（一旦赋完初始值就不可以被修改，如果过不赋初始值，默认从0开始，同样也不能被修改）

//enum Sex
//{
//	MALE=-5,
//	FEMALE,    //如果给枚举类型中可能取值的第一个赋值，其他的不赋值，也会默认一次增加1
//	SECRET
//};

//enum Sex
//{
//	MALE,
//	FEMALE=5,    //如果给枚举类型中其中一个可能取值的赋值，其他的不赋值，例如给第二个赋值，那么第一个就还是默认为0，其他的一次递增1
//	SECRET
//};
//
//int main()
//{
//	
//	printf("%d\n", MALE);//-5    0
//	printf("%d\n", FEMALE);//-4  5
//	printf("%d\n", SECRET);//-3  6
//
//	return 0;
//}

//枚举类型的使用
//enum Color//颜⾊
//{
//	RED = 1,
//	GREEN = 2,
//	BLUE = 4
//};
//int main()
//{
//	enum Color clr = GREEN;//使⽤枚举常量给枚举变量赋值 
//
//	return 0;
//}
//
////如果用#define 来定义常量:它不能进行调试，因为进行调试时，#define 定义常量这条代码已经消失了，编译器只会将int m=MAX 自动翻译成int m=100
//#define MAX 100
//int main()
//{
//	int m = MAX;
//	return 0;
//}

//枚举类型大小计算
//enum Sex
//{
//	MALE=1,
//	FEMALE=4,
//	SECRET=8
//};
//
//int main()
//{
//	enum Sex s = FEMALE;
//	printf("%d\n", sizeof(s));//用枚举类型定义的变量的大小是4个字节，因为枚举类型的可能取值对应的是一个整型类型（int）数字
//	printf("%d\n", sizeof(enum Sex));//4
//	//sizeof(4);
//	//sizeof(int);
//	return 0;
//}
//
////也可以用typedef来重命名
//typedef enum Sex
//{
//	MALE = 1,
//	FEMALE = 4,
//	SECRET = 8
//}Sex;

//联合（共用体）
//像结构体⼀样，联合体也是由⼀个或者多个成员构成，这些成员可以不同的类型。
//但是编译器只为最⼤的成员分配⾜够的内存空间。联合体的特点是所有成员共⽤同⼀块内存空间。所以联合体也叫：共⽤体。
//给联合体其中⼀个成员赋值，其他成员的值也跟着变化。
//联合体的关键字是 union

//联合类型的声明
//union Un
//{
//	char c;
//	int i;
//};
//int main()
//{
//	//联合变量的定义
//	union Un un;
//	//计算这个变量的大小
//	printf("%d\n", sizeof(un));//4
//
//	return 0;
//}

//为什么计算变量 un 时大小是4呢？
//联合的成员是共⽤同⼀块内存空间的，这样⼀个联合变量的⼤⼩，⾄少是最⼤成员的⼤⼩（因为联合⾄少得有能⼒保存最⼤的那个成员）。
//union Un
//{
//	char c;
//	int i;
//};
//int main()
//{
//	union Un un = { 0 };
//
//	//以下代码输出的三个地址是一样的
//	printf("%p\n", &un);
//	printf("%p\n", &un.i );
//	printf("%p\n", &un.c );
//
//	//以下代码输出的结果是 11223355
//	un.i = 0x11223344;
//	un.c = 0x55;
//	printf("%x\n", un.i);//11223355
//
//	un.i = 4;
//	printf("%d\n", un.i);//4  0x00000004
//	printf("%d\n", un.c);//4  0x04
//
//	return 0;
//}

//联合体大小的计算
//联合的⼤⼩⾄少是最⼤成员的⼤⼩。当最⼤成员⼤⼩不是最⼤对⻬数的整数倍的时候，就要对⻬到最⼤对⻬数的整数倍。
//union Un1
//{
//	char c[5];//1/8 -> 1   5
//	int i;//4/8 -> 4       4     ------>8
//};
//union Un2
//{
//	short c[7];//1/8 -> 1  14
//	int i;//4/8 -> 4       4     ------>16
//};
//int main()
//{
//	//下⾯输出的结果是什么？ 
//	printf("%d\n", sizeof(union Un1));//8
//	printf("%d\n", sizeof(union Un2));//16
//	return 0;
//}

//联合体的一个练习
//写⼀个程序，判断当前机器是⼤端？还是⼩端？

//之前的写法：
//int main()
//{
//	int a = 1;//0x 00 00 00 01
//	//低---------------->高
//	//01 00 00 00 - 小端
//	//00 00 00 01 - 大端
//	if (*(char*)&a == 1)
//	{
//		printf("小端\n");
//	}
//	else
//	{
//		printf("大端\n");
//	}
//	return 0;
//}

//用联合体
//int main()
//{
//	int a = 1;
//	union Un
//	{
//		char c;
//		int i;
//	}un;
//	un.i = 1;
//	if (un.c == 1)
//		printf("小端\n");
//	else
//		printf("大端\n");
//	return 0;
//}

int cheak_sys()
{
	union Un
	{
		char c;
		int i;
	}un;
	un.i = 1;
	return un.c;
}
int main()
{
	int a = 1;
	int ret = cheak_sys();
	if (ret == 1)
		printf("小端\n");
	else
		printf("大端\n");
	return 0;
}


